package util;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class Criptografia {

/*  Converte um array de bytes em uma string com a representacao hexadecimal */
private static String byte2Hex(byte[] block) {
        char[] hexChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
        '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        StringBuffer buf = new StringBuffer() ;
        int len = block.length;
        for (int i = 0; i < len; i++) {
                int high = ((block[i] & 0xf0) >> 4);
                int low = (block[i] & 0x0f);
                buf.append(hexChars[high]);
                buf.append(hexChars[low]);
        }
        return buf.toString();
}

/* Converte uma String em um array de bytes */
private static byte[] hex2Byte(String hexStr) {
    int len = hexStr.length() / 2;
    byte[] result = new byte[len];
    for (int i = 0; i < len; i++) {
        byte highB = (byte) (((byte) hexStr.charAt(i*2)) - ((byte) '0'));
        byte lowB = (byte) (((byte) hexStr.charAt(i*2+1)) - ((byte) '0'));
        if (highB > 10)
                highB = (byte) (((byte) hexStr.charAt(i*2)) - ((byte) 'A') + 10);
        if (lowB > 10)
                lowB = (byte) (((byte) hexStr.charAt(i*2+1)) - ((byte) 'A') + 10);
        result[i] = (byte) (lowB + (highB << 4));
    }
    return result;
}

/* Cifra uma string dada a chave */
public static String cifra(String texto, String chave) {
        try {
            String chave16 = chave;
            while (chave16.length() < 16) chave16 += chave16;
            chave16 = chave16.substring(0,16);
            SecretKey key = new SecretKeySpec(chave16.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] cifrado = cipher.doFinal(texto.getBytes());
            return byte2Hex(cifrado);
        } catch (Throwable t) {
            t.printStackTrace();
            return new String();
        }
}

/* Decifra uma string dada a chave */
public static String decifra(String cifrado, String chave) {
        try {
            String chave16 = chave;
            while (chave16.length() < 16) chave16 += chave16;
            chave16 = chave16.substring(0,16);
            SecretKey key = new SecretKeySpec(chave16.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
            byte[] encrypted = hex2Byte(cifrado);
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] decifrado = cipher.doFinal(encrypted);
            return new String(decifrado);
        } catch (Throwable t) {
            //t.printStackTrace();
            return new String();
        }
}

}


